﻿/**
 * Created in 2012-2-8.
 */
package kit4j.ui.cs.awt.image.drawer;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import kit4j.generator.keyed.IKeyedGenerator;
import kit4j.generator.keyed.RandomPositiveIntegerKeyedGenerator;
import kit4j.generator.keyless.IKeylessGenerator;
import kit4j.generator.keyless.RandomColorKeylessGenerator;

/**
 * 在图像上绘制宽为1、高为1、随机颜色、随机位置的点的绘制器。该绘制器确定在图像的每一块指定宽高范围内只存在一个点。
 * 
 * @author MiniKnife
 * 
 */
public class RandomColorPointDrawer implements IDrawer {

	/**
	 * 每一个点所占据区域的宽度。
	 */
	protected int everyDotAreaWidth;

	/**
	 * 每一个点所占据区域的高度。
	 */
	protected int everyDotAreaHeight;

	protected IKeyedGenerator<Integer, Integer> intGenerator;

	protected IKeylessGenerator<Color> colorGenerator;

	/**
	 * 创建一个随机点绘制器。默认的点所占区域宽度为10，高度为10。
	 */
	public RandomColorPointDrawer() {
		this(10, 10);
	}

	/**
	 * 创建一个随机点绘制器。
	 * 
	 * @param everyDotAreaWidth
	 *            每一个点所占据区域的宽度
	 * @param everyDotAreaHeight
	 *            每一个点所占据区域的高度
	 */
	public RandomColorPointDrawer(int everyDotAreaWidth, int everyDotAreaHeight) {
		this.everyDotAreaWidth = everyDotAreaWidth;
		this.everyDotAreaHeight = everyDotAreaHeight;

		intGenerator = new RandomPositiveIntegerKeyedGenerator();
		colorGenerator = new RandomColorKeylessGenerator();
	}

	/**
	 * @see kit4j.ui.cs.awt.image.drawer.IDrawer#draw(java.awt.Image)
	 */
	@Override
	public Image draw(Image img) {
		Graphics g = img.getGraphics();
		int dotX, dotY;
		int imgWidth = img.getWidth(null), imgHeight = img.getHeight(null);

		for (int x = 0; x < imgWidth; x += everyDotAreaWidth) {
			for (int y = 0; y < imgHeight; y += everyDotAreaHeight) {
				// 随机位置
				dotX = x + intGenerator.next(everyDotAreaWidth + 1);
				dotY = y + intGenerator.next(everyDotAreaHeight + 1);

				// 随机颜色
				g.setColor(nextColor());

				g.drawRect(dotX, dotY, 1, 1);
			}
		}

		return img;
	}
	
	/**
	 * @return 下一个要绘制的点的颜色
	 */
	protected Color nextColor() {
		return colorGenerator.next();
	}

	/**
	 * @return 每一个点所占据区域的宽度
	 */
	public int getEveryDotAreaWidth() {
		return everyDotAreaWidth;
	}

	/**
	 * 设置每一个点所占据区域的宽度。
	 * 
	 * @param everyDotAreaWidth
	 *            宽度
	 */
	public void setEveryDotAreaWidth(int everyDotAreaWidth) {
		this.everyDotAreaWidth = everyDotAreaWidth;
	}

	/**
	 * @return 每一个点所占据区域的高度
	 */
	public int getEveryDotAreaHeight() {
		return everyDotAreaHeight;
	}

	/**
	 * 设置每一个点所占据区域的高度。
	 * 
	 * @param everyDotAreaHeight
	 *            高度
	 */
	public void setEveryDotAreaHeight(int everyDotAreaHeight) {
		this.everyDotAreaHeight = everyDotAreaHeight;
	}

}
